package persistencia.xml.pruebas;

import static org.junit.Assert.*;

import java.beans.DefaultPersistenceDelegate;
import java.io.File;
import java.util.TreeSet;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import compartido.IEntidad;

import persistencia.carreras.ClaveValor;
import persistencia.xml.CodificadorXML;
import persistencia.xml.GondolaXML;

public class TestGondolaXML {

	protected TreeSet<ClaveValor> SetClaveValor;
	protected String archivoDePrueba;
	@Before
	public void setUp() throws Exception {
		CodificadorXML codificador = CodificadorXML.getInstancia();
		
		codificador.registrarDelegado(
				ClaveValor.class,
				new DefaultPersistenceDelegate(new String[] {"identificador","valor"})
		);
		
		SetClaveValor = new TreeSet<ClaveValor>();
		SetClaveValor.add(new ClaveValor("cero", "0:0"));
		SetClaveValor.add(new ClaveValor("a", "1:0"));
		SetClaveValor.add(new ClaveValor("b", "0:1"));
		SetClaveValor.add(new ClaveValor("c", "1:1"));
	
		archivoDePrueba ="src/persistencia/xml/pruebas/testGondolaXML.xml";
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void AgregarElementosYComprobarQueEstenTodos_EjecucionCorrecta() {
		GondolaXML gondola = new GondolaXML("SoloEnMemoria");
		
		for (ClaveValor claveValor : SetClaveValor)
			assertTrue(gondola.agregar(claveValor));
		
		assertFalse(gondola.agregar(SetClaveValor.first()));
		
		int existentes = 0;
		int entidades = 0;
		for (IEntidad entidad : gondola) {
			if (entidad instanceof ClaveValor) {
				assertTrue(SetClaveValor.contains((ClaveValor)entidad));
				existentes++;
			}
			entidades++;
		}
		assertEquals(SetClaveValor.size(), existentes);
		assertEquals(SetClaveValor.size(), entidades);
	}

	@Test
	public void AgregarElementosYEliminarlos_EjecucionCorrecta() {
		
		GondolaXML gondola = new GondolaXML("SoloEnMemoria");
		
		for (ClaveValor claveValor : SetClaveValor)
			gondola.agregar(claveValor);
		

		ClaveValor eliminado = SetClaveValor.first();
		assertTrue(gondola.eliminar(eliminado));
		assertFalse(gondola.eliminar(eliminado));
		
		int existentes = 0;
		int entidades = 0;
		for (IEntidad entidad : gondola) {
			if (entidad instanceof ClaveValor) {
				if (SetClaveValor.contains((ClaveValor)entidad))
					existentes++;
			}
			entidades++;
		}
		
		assertEquals(null, gondola.obtener(eliminado.getIdentificador()));
		
		assertEquals(SetClaveValor.size()-1, existentes);
		assertEquals(SetClaveValor.size()-1, entidades);		
	}

	@Test
	public void ModificarElementoNoExistenteYExistente_EjecucionCorrecta() {
		GondolaXML gondola = new GondolaXML("SoloEnMemoria");
		
		for (ClaveValor claveValor : SetClaveValor)
			gondola.agregar(claveValor);
		
		ClaveValor original = SetClaveValor.last();
		String nuevoValor = "NuevoValor";
		ClaveValor modificado = new ClaveValor(original.getIdentificador(),nuevoValor);
		ClaveValor nuevo = new ClaveValor("z","NoExiste");

		assertFalse(gondola.modificar(nuevo));
		assertTrue(gondola.modificar(modificado));

		IEntidad entidad = gondola.obtener(original.getIdentificador());
		assertEquals(modificado, entidad);
	}

	@Test
	public void IntentarObtenerElementoExistente() {
		GondolaXML gondola = new GondolaXML("SoloEnMemoria");
		
		for (ClaveValor claveValor : SetClaveValor)
			gondola.agregar(claveValor);
		
		IEntidad buscado = gondola.obtener(SetClaveValor.first().getIdentificador());
		
		assertEquals(SetClaveValor.first(), buscado);
	}
	
	@Test
	public void IntentarObtenerElementoInexistente() {
		GondolaXML gondola = new GondolaXML("SoloEnMemoria");
		
		for (ClaveValor claveValor : SetClaveValor)
			gondola.agregar(claveValor);

		IEntidad buscado = gondola.obtener("Identificador inexistente");
		assertEquals(null, buscado);
	}
	
	@Test
	public void GuardarGondolaDosVecesYComprobarQueNoEscriboBytesDeMas_EjecucionCorrecta() {
		File archivo = new File(archivoDePrueba);
		if (archivo.exists())
			archivo.delete();
		GondolaXML gondola = new GondolaXML(archivo.getName());
		
		for (ClaveValor claveValor : SetClaveValor)
			gondola.agregar(claveValor);
		
		gondola.guardar();
		
		long tamanio = archivo.getTotalSpace();
		
		gondola.guardar();
		
		assertEquals(tamanio, archivo.getTotalSpace());
	
	}
	
	@Test
	public void CopiarGondolaMedianteUnArchivo_EjecucionCorrecta() {
		File archivo = new File(archivoDePrueba);
		if (archivo.exists())
			archivo.delete();
		GondolaXML gondola = new GondolaXML(archivo.getName());
		
		for (ClaveValor claveValor : SetClaveValor)
			gondola.agregar(claveValor);
		
		gondola.guardar();
		
		GondolaXML copia = new GondolaXML(archivo.getName());
		
		for (IEntidad entidad : copia) {
			if (entidad instanceof ClaveValor) {
				System.out.println(entidad);
				assertTrue(SetClaveValor.contains((ClaveValor)entidad));
			}
		}
	}
	
}
